package com.ssm.basis.service.util;

import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.common.TemplateParserContext;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

/**
 * <a href="https://blog.csdn.net/f641385712/article/details/90812967">EL 表达式解析</a>
 */
public abstract class ExpressionUtil {
    /**
     * 根据 el 表达式获取值(对象直接就是根元素)
     *
     * @param el         el 表达式
     * @param rootObject 信息
     */
    public static Object getElValue(String el, Object rootObject) {
        SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
        Expression expression = spelExpressionParser.parseExpression(el);
        EvaluationContext context = new StandardEvaluationContext(rootObject);
        return expression.getValue(context);
    }

    /**
     * 根据 el 表达式获取值(既是根元素也是变量元素，对象变量是 c，占位符为 ${})
     *
     * @param el         el 表达式
     * @param rootObject 信息
     */
    public static Object getThisElValue(String el, Object rootObject) {
        SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
        Expression expression = spelExpressionParser.parseExpression(el, new TemplateParserContext("${", "}"));
        EvaluationContext context = new StandardEvaluationContext(rootObject);
        context.setVariable("c", rootObject);
        return expression.getValue(context);
    }
}